
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Stream - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Stream - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Java 8 Stream API 相较于传统的集合处理方式，主要有哪些优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. **简化代码**：提供了一种更加简洁、清晰的方式来处理集合数据，减少了繁琐的迭代和条件判断。<br>2. **提高效率**：使用了惰性求值和并行处理的方式，可以更高效地处理大规模数据。<br>3. **支持并行处理**：提供了并行流的功能，可以方便地进行并行处理，充分利用多核处理器的性能。</div>
          </div>
          <div class="card-source">来源: Stream 简介 -> 2. Stream 的作用和优势</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 Java Stream 中，如何创建无限流？请列举并说明两种方法。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以通过 `Stream.generate()` 和 `Stream.iterate()` 方法创建无限流。例如，`Stream.generate(() -> 1)` 创建一个包含无限个元素1的流；`Stream.iterate(0, n -> n + 2)` 创建一个从0开始，每个后续元素是前一个元素加2的无限流。</div>
          </div>
          <div class="card-source">来源: 创建 Stream -> 4. 使用 Stream.generate() 创建无限流 / 5. 使用 Stream.iterate() 创建无限流</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">什么是 Stream 的“延迟执行”（Lazy Execution）特性？它有什么好处？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“延迟执行”是指 Stream 中的中间操作只有在调用终止操作时才会真正执行。这种特性的好处是可以提高效率，因为它避免了不必要的计算和资源浪费。</div>
          </div>
          <div class="card-source">来源: Stream API 的扩展 -> 1. Stream 延迟执行</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">概念</div>
          <div class="card-question">请区分串行流（Sequential Stream）和并行流（Parallel Stream）。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">概念</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">串行流是 Stream 的默认模式，它按顺序在单个线程中处理流中的每个元素。而并行流会将流中的元素分成多个部分，并在多个线程中同时处理这些部分，适用于大规模数据处理和复杂计算任务。可以通过 `parallel()` 方法将串行流转换为并行流。</div>
          </div>
          <div class="card-source">来源: 并行流和串行流 -> 1. 什么是串行流和并行流？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">使用并行流（Parallel Stream）时，需要注意哪些潜在问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要需要注意两点：1. **容易出错**：并行流可能引发线程安全问题，需要额外的同步处理，增加了复杂性。2. **内存消耗较大**：并行流需要额外的线程和同步机制，可能导致内存消耗较大。</div>
          </div>
          <div class="card-source">来源: 并行流和串行流 -> 3. 并行流的优势和注意事项</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">自定义一个 Stream 收集器（Collector）需要实现哪几个核心方法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">自定义收集器需要实现 `Collector` 接口的 `supplier()`、`accumulator()`、`combiner()` 和 `finisher()` 四个方法，以实现定制化的汇总功能。</div>
          </div>
          <div class="card-source">来源: Stream API 的扩展 -> 5. 自定义收集器</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Stream 的操作分为哪两种基本类型？它们之间有何关键区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Stream 操作分为中间操作（Intermediate Operations）和终端操作（Terminal Operations）。关键区别在于：中间操作返回一个新的 Stream，可以进行链式调用；而终端操作会产生最终结果或副作用，是触发所有计算的最后一步。</div>
          </div>
          <div class="card-source">来源: Stream注意事项 -> 7. 理解中间操作和终端操作</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">在使用无限流时，为什么需要特别小心，并应采取什么措施？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">使用无限流时要格外小心，因为它们可能导致内存溢出或无限循环。必须确保使用短路操作（如 `findFirst()`）或限制元素数量的操作来及早终止流的处理。</div>
          </div>
          <div class="card-source">来源: Stream注意事项 -> 4. 谨慎使用无限流</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">请列举五种常见的 Stream 操作类型，并简要说明其作用。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. **过滤操作 (`filter`)**：筛选出满足条件的元素。<br>2. **映射操作 (`map`)**：将每个元素映射成另一个元素。<br>3. **排序操作 (`sorted`)**：对元素进行自然或自定义排序。<br>4. **聚合操作 (`reduce`)**：将所有元素按照指定的规则进行聚合。<br>5. **收集操作 (`collect`)**：将流中的元素收集到一个结果容器中。</div>
          </div>
          <div class="card-source">来源: Stream 操作</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
